package fr.auzaiphe.admin.model;

import java.util.ArrayList;

import javax.swing.JOptionPane;

import fr.auzaiphe.admin.bdd.BaseDeDonnee;
import fr.auzaiphe.admin.bdd.ChargementHandler;
import fr.auzaiphe.admin.bdd.ScenarioBDD;
import fr.auzaiphe.admin.constantes.ConstantesAdmin;

/**
 *
 * @author Hugp
 * Classe mere de scenario et partie qui seront liées à l'adminModel.
 *
 */
public abstract class Jeu
{
	protected BaseDeDonnee bdd;
	protected ArrayList<Alerte> listeAlertes;
	protected ArrayList<Indice> listeIndices;
	protected ArrayList<Joueur> listeJoueurs;
	protected ChronoGeneral chrono;
	protected Historique historique;
	protected String texte;
	protected ScenarioBDD imageBDD;

	protected int prixIndice;

	protected AdminModel model;

	public Jeu(AdminModel pModel)
	{
		this.model = pModel;
		this.bdd = new BaseDeDonnee();
		this.listeAlertes = new ArrayList<Alerte>();
		this.listeIndices = new ArrayList<Indice>();
		this.listeJoueurs = new ArrayList<Joueur>();
		this.chrono = new ChronoGeneral(this.model);
		this.historique = new Historique();
		ChronoAdmin.setHistorique(this.historique);
		this.bdd = new BaseDeDonnee();
		this.bdd.nouveau();
		this.imageBDD = new ScenarioBDD(this.bdd, this);
		this.prixIndice = ConstantesAdmin.PRIX_INDICE_DEFAUT;
	}

	/**
	 * Ferme la base de donn�e proprement
	 * Coupe la connexion et supprime le dossier temp
	 */
	public void closeBdd()
	{
		this.bdd.supprimerBDD();
	}

	/**
	 * Enregistre un nouveau fichier
	 * @param pPath
	 */
	public void enregistreSous(String pPath)
	{
		this.bdd.changerNomFichier( pPath );
		this.bdd.enregister();
	}

	/**
	 * Charge un ancien fichier
	 * @param pPath
	 */
	public void charger(String pPath)
	{
		this.listeAlertes.clear();
		this.listeJoueurs.clear();
		this.listeIndices.clear();
		this.historique.getListeEvenements().clear();
		this.texte = "";

		this.bdd.ouvrir( pPath );

		new ChargementHandler( this.bdd, this );
	}

	/**
	 * Enregistrer la version courante du scenario
	 */
	public void enregistrer()
	{
		this.bdd.enregister();
	}

	public void ouvrirNouveau()
	{
		this.listeAlertes.clear();
		this.listeJoueurs.clear();
		this.listeIndices.clear();
		this.historique.getListeEvenements().clear();
		this.texte = "";
		this.chrono.setTempsRestant( 0 );

		this.bdd.arretDB();
		this.bdd.nouveau();
	}

	/**
	 * addAlerte : Ajout d'une alerte dans un scenario (chargée à partir d'un fichier .murder)
	 * @param pCibleAll Si l'alerte cible l'interface joueur non connecté
	 * @param pCibleAdmin Si l'alerte cible l'interface admin
	 * @param pCible Joueur cible s'il y a (peut etre null)
	 * @param pChronoCible Chrono ou mettre le flag
	 * @param pActivation Heure d'activation
	 * @param pTexte Texte a afficher
	 * @param pLienFichier Contenu a  afficher
	 */
	public void addAlerte(	int pId,
							boolean pCibleAll,
							boolean pCibleAdmin,
							Joueur pCible,
							ChronoAdmin pChronoCible,
							int pActivation,
							String pTitre,
							String pTexte,
							String pLienFichier)
	{
		Alerte newAlerte = (pCibleAll || pCibleAdmin) ?
			// Alerte pour Admin ou tout le monde
			new Alerte(pId, this.bdd ,pCibleAdmin, pCibleAll,pChronoCible,pActivation,pTitre, new Contenu(pLienFichier, pTexte) )
				:
			// Alerte pour un joueur en particulier
			new Alerte(pId, this.bdd,pCible,pChronoCible,pActivation,pTitre,new Contenu(pLienFichier,pTexte));
			for(Alerte alr : this.listeAlertes)
			{
				System.out.println(alr.getTitre());
				if(alr.equals(newAlerte))
				{
					JOptionPane.showMessageDialog(null, "Jeu : L'alerte indiquée existe déjà.", "Ajout alerte", JOptionPane.ERROR_MESSAGE);
					return;
				}
			}
			this.listeAlertes.add(newAlerte);
	}


	/**
	 * addAlerte : Ajout d'une alerte dans un scenario
	 * @param pCibleAll Si l'alerte cible l'interface joueur non connecté
	 * @param pCibleAdmin Si l'alerte cible l'interface admin (si avec cibleAll, fera cibleAll)
	 * @param pCible Joueur cible s'il y a (peut etre null)
	 * @param pChronoCible Chrono ou mettre le flag
	 * @param pActivation Heure d'activation
	 * @param pTexte Texte a afficher
	 * @param pLienFichier Contenu a  afficher
	 */
	public void addAlerte(	boolean pCibleAll,
							boolean pCibleAdmin,
							Joueur pCible,
							ChronoAdmin pChronoCible,
							int pActivation,
							String pTitre,
							String pTexte,
							String pLienFichier)
	{
		Alerte newAlerte = (pCibleAll || pCibleAdmin) ?
			// Alerte pour Admin ou tout le monde
			new Alerte(this.bdd ,pCibleAll, pCibleAdmin,pChronoCible,pActivation,pTitre, new Contenu(pLienFichier, pTexte) )
				:
			// Alerte pour un joueur en particulier
			new Alerte(this.bdd,pCible,pChronoCible,pActivation,pTitre,new Contenu(pLienFichier,pTexte));
			for(Alerte alr : this.listeAlertes)
				if(alr.equals(newAlerte))
				{
					JOptionPane.showMessageDialog(null, "Jeu : L'alerte indiquée existe déjà.", "Ajout alerte", JOptionPane.ERROR_MESSAGE);
					return;
				}
			this.listeAlertes.add(newAlerte);
	}

	/**
	 * addAlerte : Ajout d'une alerte dans un scenario A PARTIR DE L'INTERFACE (connaissant seulement nom et prenom)
	 * @param pCibleAll Si l'alerte cible l'interface joueur non connecté
	 * @param pCibleAdmin Si l'alerte cible l'interface admin (si avec cibleAll, fera cibleAll)
	 * @param pCible Joueur cible s'il y a (peut etre null)
	 * @param pChronoCible Chrono ou mettre le flag
	 * @param pActivation Heure d'activation
	 * @param pTexte Texte a afficher
	 * @param pLienFichier Contenu a  afficher
	 */
	public void addAlerte(	boolean pCibleAll,
							boolean pCibleAdmin,
							String pNomCible,
							String pPrenomCible,
							String pNomChrono,
							String pPrenomChrono,
							int pActivation,
							String pTitre,
							String pTexte,
							String pLienFichier)
	{
		//Recuperation du joueur au meme nom prenom dans le modèle
		Joueur cible = null;
		ChronoGeneral chGnrTmp = null;
		SousChrono ssChTmp = null;

		if(!(pPrenomCible=="" && pNomCible==""))
			for(Joueur j : this.listeJoueurs)
				if( j.getNomPersonnage().equals(pNomCible) && j.getPrenomPersonnage().equals(pPrenomCible))
					cible = j;

		//Pointe soit sur le chrono general soit sur le chrono d'un joueur.
		if(pPrenomChrono=="" && pNomChrono=="")
			chGnrTmp = this.chrono;
		else
			for(Joueur j : this.listeJoueurs)
				if(j.getNomPersonnage().equals(pNomChrono) && j.getPrenomPersonnage().equals(pPrenomChrono))
					ssChTmp = j.getChrono();

		Alerte newAlerte = (pCibleAll || pCibleAdmin) ?
			// Alerte pour Admin ou tout le monde
			new Alerte(this.bdd ,pCibleAll, pCibleAdmin,(chGnrTmp==null)?ssChTmp:chGnrTmp,pActivation, pTitre, new Contenu(pLienFichier, pTexte) )
				:
			// Alerte pour un joueur en particulier
			new Alerte(this.bdd,cible,(chGnrTmp==null)?ssChTmp:chGnrTmp,pActivation,pTitre,new Contenu(pLienFichier,pTexte));
		for(Alerte alr : this.listeAlertes)
			if(alr.equals(newAlerte))
			{
				JOptionPane.showMessageDialog(null, "Jeu : L'alerte indiquée existe déjà.", "Ajout alerte", JOptionPane.ERROR_MESSAGE);
				return;
			}
		this.listeAlertes.add(newAlerte);
	}

	public ArrayList<Indice> getListeIndices()
	{
		return this.listeIndices;
	}

	/**
	 * addIndice : Ajout d'un indice dans la structure de jeu.
	 * @param pVisibles Liste des joueurs pour lesquels l'indice est visible.
	 * @param pLies Liste des joueurs qui sont concernés par l'indice
	 * @param pContenu Texte affiché par l'indice
	 * @param pLienFichier Lien du fichier affiché par l'indice
	 * @param pDebutVie Heure de début de vie de l'indice. Ne peut être inférieur à la fin de vie de l'indice.
	 * @param pFinVie Heure de fin de vie de l'indice. Ne peut être supérieur au début de vie de l'indice.
	 * @param pOn Evenement d'activation de l'indice. Les booleens n'existant pas en bdd, c'est un integer valant 0 ou 1. Ne peut être faux quand pOff est vrai.
	 * @param pOff Evenement de désactivation de l'indice. Les booleens n'existant pas en bdd, c'est un integer valant 0 ou 1. Ne peut être vrai quand pOn est faux.
	 */

	public void addIndice(ArrayList<Joueur> pVisibles,
			  ArrayList<Joueur> pLies,
			  int pId,
			  String pContenu,
			  String pLienFichier,
			  String pTitre,
			  int pDebutVie,
			  int pFinVie,
			  int pOn,
			  int pOff)
	{
		if( ! ( (pOn==0 && pOff==1) && pDebutVie > pFinVie) )
		{
			Indice newIndice = new Indice(pId,this.bdd,pVisibles, pLies, pContenu,pLienFichier,pTitre,pDebutVie,pFinVie,pOn,pOff);

			// Ajout de l'indice dans les listes des joueurs qui peuvent voir les indices
			for ( int i = 0; i < pVisibles.size(); i++ )
			{
				pVisibles.get(i).giveIndice( newIndice );
			}

			//Ajoute un l'indice seulement s'il n'est pas dejà dans la liste
			for(Indice ind : this.listeIndices)
			{
				if(ind.equals(newIndice))
				{
					JOptionPane.showMessageDialog(null, "Jeu : L'indice indiqué existe déjà.", "Ajout indice", JOptionPane.ERROR_MESSAGE);
					return;
				}
			}

			this.chrono.addFlagIndicesDebut(newIndice, pDebutVie);
			this.chrono.addFlagIndicesFin(newIndice, pFinVie);
			this.listeIndices.add(newIndice);
		}
		else
		{
			System.err.println("Jeu : Variables evenements pOn et pOff mal renseignees, ou l'heure de fin de vie est superieure a l'heure de debut vie.");
		}
	}

	public void addIndice(ArrayList<Joueur> pVisibles,
						  ArrayList<Joueur> pLies,
						  String pContenu,
						  String pLienFichier,
						  String pTitre,
						  int pDebutVie,
						  int pFinVie,
						  int pOn,
						  int pOff)
	{
		if( ! ( (pOn==0 && pOff==1) && pDebutVie > pFinVie) )
		{
			Indice newIndice = new Indice(this.bdd,pVisibles, pLies, pContenu,pLienFichier,pTitre,pDebutVie,pFinVie,pOn,pOff);

			// Ajout de l'indice dans les listes des joueurs qui peuvent voir les indices
			for ( int i = 0; i < pVisibles.size(); i++ )
			{
				pVisibles.get(i).giveIndice( newIndice );
			}

			//Ajoute un l'indice seulement s'il n'est pas dejà dans la liste
			for(Indice ind : this.listeIndices)
			{
				if(ind.equals(newIndice))
				{
					JOptionPane.showMessageDialog(null, "Jeu : L'indice indiqué existe déjà.", "Ajout indice", JOptionPane.ERROR_MESSAGE);
					return;
				}
			}

			this.chrono.addFlagIndicesDebut(newIndice, pDebutVie);
			this.chrono.addFlagIndicesFin(newIndice, pFinVie);
			this.listeIndices.add(newIndice);
		}
		else
			System.err.println("Jeu : Variables evenements pOn et pOff mal renseignees, ou l'heure de fin de vie est superieure a l'heure de debut vie.");
	}

	public ArrayList<Joueur> getListeJoueurs()
	{
		return this.listeJoueurs;
	}

	/**
	 * addJoueur : Ajouter un joueur dans le modele
	 * @param pNomPersonnage Nom du personnage incarné ar le joueur.
	 * @param pPrenomPersonnage Prenom du personnage incarné par le joueur.
	 * @param pBackgroundPersonnage Background du personnage.
	 * @param pPassword Mot de passe de connexion du personnage.
	 * @param pChrono Temps de connexion du personnage.
	 */
	public void addJoueur(String pNomPersonnage,
						  String pPrenomPersonnage,
						  String pBackgroundPersonnage,
						  String pPassword,
						  int pChrono)
	{
		Joueur newJoueur = new Joueur(this.bdd,pNomPersonnage,pPrenomPersonnage,pPassword,pBackgroundPersonnage,pChrono,this.model);
		for(Joueur jr : this.listeJoueurs)
			if(jr.equals(newJoueur))
			{
				JOptionPane.showMessageDialog(null, "Le joueur indiqué existe déjà (Nom et mot de passe)", "Erreur", JOptionPane.ERROR_MESSAGE);
				return;
			}

		this.listeJoueurs.add(newJoueur);
	}

	public void addJoueur(int pIdJoueur,
					      String pNomPersonnage,
					      String pPrenomPersonnage,
					      String pBackgroundPersonnage,
					      String pPassword,
					      int pChrono)
	{
		Joueur newJoueur = new Joueur( pIdJoueur, this.bdd, pNomPersonnage,pPrenomPersonnage,pPassword,pBackgroundPersonnage,pChrono,this.model);
		for(Joueur jr : this.listeJoueurs)
			if(jr.equals(newJoueur))
			{
				JOptionPane.showMessageDialog(null, "Le joueur indiqué existe déjà (Nom et mot de passe)", "Erreur", JOptionPane.ERROR_MESSAGE);
				return;
			}

		this.listeJoueurs.add(newJoueur);
	}

	/**
	 *
	 * @param pContenuScenario - contenu textuelle du scenario de la partie
	 * @param pValeurChrono - entier designant la valeur du chrono général
	 */
	public void saveScenario(String pContenuScenario, int pValeurChrono)
	{
		this.texte = pContenuScenario;
		this.chrono.setTempsRestant( pValeurChrono );

		this.imageBDD.sauvegarde();
	}

	/**
	 * Met à jour un joueur dans la base de donnée
	 * @param pOldNom L'ancien nom
	 * @param pOldPrenom L'ancien prénom
	 * @param pNomPersonnage Le nouveau nom
	 * @param pPrenomPersonnage Le nouveau prénom
	 * @param pBackgroundPersonnage La description du personnage
	 * @param pPassword Le mot de passe du joueur
	 * @param pChrono Le chrono du joueur
	 */
	public void updateJoueur(String pOldNom,
						  String pOldPrenom,
					      String pNomPersonnage,
					      String pPrenomPersonnage,
					      String pBackgroundPersonnage,
					      String pPassword,
					      int pChrono)
	{
		boolean noJoueur = true;
		int i = 0;
		while(i < this.listeJoueurs.size() && noJoueur)
		{
			if(this.listeJoueurs.get(i).getNomPersonnage().equals(pOldNom) && this.listeJoueurs.get(i).getPrenomPersonnage().equals(pOldPrenom))
			{
				this.listeJoueurs.get(i).setNomPersonnage(pNomPersonnage);
				this.listeJoueurs.get(i).setPrenomPersonnage(pPrenomPersonnage);
				this.listeJoueurs.get(i).setBackgroundPersonnage(pBackgroundPersonnage);
				this.listeJoueurs.get(i).setPassword(pPassword);
				this.listeJoueurs.get(i).getChrono().setTempsRestant( pChrono );
				this.listeJoueurs.get(i).getImageBDD().sauvegarde();
				noJoueur = false;
			}
			i++;
		}
	}

	/**
	 * Supprimer un joueur à partir de la vue
	 * @param pJoueurSupprime
	 */
	public void supprimerJoueur(Joueur pJoueurSupprime)
	{
		// Suppression dans les alertes
		this.supprimerAlertePointantJoueur(pJoueurSupprime);

		// Suppression dans les indices
		this.supprimerJoueurListeIndice(pJoueurSupprime);

		// Suppression du joueur du model et de la BDD
		pJoueurSupprime.supprimer();
		this.listeJoueurs.remove( pJoueurSupprime );
	}

	/**
	 * Supprime le joueurs des listes
	 * joueurLies et joueurVisibles de chaque indice du jeu
	 * @param pJoueurSupprime
	 */
	private void supprimerJoueurListeIndice(Joueur pJoueurSupprime)
	{
		for ( int i = 0; i < this.listeIndices.size(); i++ )
		{
			if( this.listeIndices.get(i).getJoueursLies().contains(pJoueurSupprime) )
			{
				System.out.println("Supprime un joueur lié");
				this.listeIndices.get(i).getJoueursLies().remove(pJoueurSupprime);
			}

			if( this.listeIndices.get(i).getJoueursVisibles().contains( pJoueurSupprime) )
			{
				System.out.println("Supprime un joueur visible");
				this.listeIndices.get(i).getJoueursVisibles().remove(pJoueurSupprime);
			}
		}
	}

	/**
	 * Supprime les alertes qui pointe le joueur
	 * Appelé par la suppression du joueur
	 * @param pJoueurSupprime - Joueur ciblé par les alertes
	 */
	private void supprimerAlertePointantJoueur( Joueur pJoueurSupprime )
	{
		for ( int i = 0; i < this.listeAlertes.size(); i++ )
		{
			if ( this.listeAlertes.get(i).getCible() == pJoueurSupprime )
			{
				System.out.println("Suppression Alerte Model");
				this.listeAlertes.remove(i);
			}
		}
	}

	/**
	 * Supprimer unz alerte à partir de la vue
	 * @param pAlerteSupprime
	 */
	public void supprimerAlerte(Alerte pAlerteSupprime)
	{
		// Suppression de l'alerte du model et de la BDD
		this.listeAlertes.remove( pAlerteSupprime );
		this.chrono.rmvFlagAlertes(pAlerteSupprime, pAlerteSupprime.getActivation());
		for(Joueur j : this.listeJoueurs)
			j.getChrono().rmvFlagAlertes(pAlerteSupprime, pAlerteSupprime.getActivation());

		pAlerteSupprime.supprimer();
	}

	/**
	 * Supprime un indice de la partie ainsi que toutes les
	 * liens qui pointent vers lui
	 * @param pIndiceSupprime
	 */
	public void supprimerIndice(Indice pIndiceSupprime)
	{
		// Supprimer l'indice des disponibilités du joueurs
		this.supprimeIndiceDisponibleAuxJoueurs( pIndiceSupprime );

		// Supprimer l'indice du jeu
		pIndiceSupprime.supprimer();
		this.listeIndices.remove( pIndiceSupprime );
		this.chrono.rmvFlagIndicesDebut(pIndiceSupprime, pIndiceSupprime.getDebutVie());
		this.chrono.rmvFlagIndicesFin(pIndiceSupprime, pIndiceSupprime.getFinVie());
	}

	private void supprimeIndiceDisponibleAuxJoueurs(Indice pIndiceSupprime)
	{
		for( int i = 0; i < this.listeJoueurs.size(); i++ )
		{
			if ( this.listeJoueurs.get(i).getIndicesDispo().contains(pIndiceSupprime) )
			{
				this.listeJoueurs.get(i).getIndicesDispo().remove(pIndiceSupprime);
			}
		}
	}

	/**
	 * Mise à jour des indices
	 * @param pId
	 * @param pJoueursVisibles
	 * @param pJoueursLies
	 * @param pTitre
	 * @param pContenu
	 * @param pPath
	 * @param pDebut
	 * @param pFin
	 */
	public void updateIndice(int pId, ArrayList<Joueur> pJoueursVisibles,
			ArrayList<Joueur> pJoueursLies, String pTitre, Contenu pContenu, int pDebut, int pFin)
	{
		boolean noIndice = true;
		int i = 0;
		while(i < this.listeIndices.size() && noIndice)
		{
			if(this.listeIndices.get(i).getId() == pId)
			{
				// Suppression de l'indice dans la liste des indicesDispo des joueurs
				for( int j = 0; j < this.listeIndices.get(i).getJoueursVisibles().size(); j++ )
				{
					this.listeIndices.get(i).getJoueursVisibles().get(j).takeIndice( this.listeIndices.get(i) );
				}

				this.chrono.rmvFlagIndicesDebut(this.listeIndices.get(i), this.listeIndices.get(i).getDebutVie());
				this.chrono.rmvFlagIndicesFin(this.listeIndices.get(i), this.listeIndices.get(i).getFinVie());
				this.listeIndices.get(i).setJoueursVisibles(pJoueursVisibles);
				this.listeIndices.get(i).setJoueursLies(pJoueursLies);
				this.listeIndices.get(i).setTitre(pTitre);
				this.listeIndices.get(i).setContenuIndice(pContenu);
				this.listeIndices.get(i).setDebutVie(pDebut);
				this.listeIndices.get(i).setFinVie(pFin);

				// Mise à jour de l'indice pour les joueurs
				for( int j = 0; j < pJoueursVisibles.size(); j++ )
				{
					pJoueursVisibles.get(j).ifNotGetGiveIndice( this.listeIndices.get(i) );
				}

				this.listeIndices.get(i).getImageBDD().sauvegarde();
				this.chrono.addFlagIndicesDebut(this.listeIndices.get(i), this.listeIndices.get(i).getDebutVie());
				this.chrono.addFlagIndicesFin(this.listeIndices.get(i), this.listeIndices.get(i).getFinVie());
				noIndice = false;
			}
			i++;
		}
	}

	public void updateAlerte(int pId,
			  boolean pCibleAll,
			  boolean pCibleAdmin,
			  String pNomJoueur,
			  String pPrenomJoueur,
			  String pNomChrono,
			  String pPrenomChrono,
			  int pActivation,
			  String pTitre,
			  String pTexte,
			  String pLienFichier)
	{
		for(Alerte a : this.listeAlertes)
		{
			if(a.getId() == pId)
			{
				a.getChronoCible().rmvFlagAlertes(a, a.getActivation());
				//Titre unique
				if(!(a.getTitre().equals(pTitre)))
					for(Alerte a2 : this.listeAlertes)
						if(a2.getTitre().equals(pTitre))
						{
							JOptionPane.showMessageDialog(null,
								    "Une alerte ayant le même titre existe déjà.",
								    "Erreur de mise à jour",
								    JOptionPane.ERROR_MESSAGE);
							return;
						}
				a.setTitre(pTitre);
				a.setCibleAll(pCibleAll);
				a.setCibleAdmin(pCibleAdmin);
				System.out.println("Joeuur cible : "+pPrenomJoueur+" "+pNomJoueur);
				if(!(pPrenomJoueur=="" && pNomJoueur==""))
					for(Joueur j : this.listeJoueurs)
						if( j.getNomPersonnage().equals(pNomJoueur) && j.getPrenomPersonnage().equals(pPrenomJoueur))
							a.setCible(j);
				if(pPrenomChrono=="" && pNomChrono=="")
					a.setChronoCible(this.chrono);
				else
					for(Joueur j : this.listeJoueurs)
						if(j.getNomPersonnage().equals(pNomChrono) && j.getPrenomPersonnage().equals(pPrenomChrono))
							a.setChronoCible(j.getChrono());
				a.setActivation(pActivation);
				a.getChronoCible().addFlagAlertes(a, a.getActivation());
				a.setContenu(new Contenu(pLienFichier, pTexte));
				a.getImageBDD().sauvegarde();
			}
		}
	}

	public ChronoGeneral getChrono()
	{
		return this.chrono;
	}

	/**
	 *  Recup un joueur avec son nom et son prénom
	 * @param pNom
	 * @param pPrenom
	 */
	public Joueur getJoueur(String pNom, String pPrenom)
	{
		for ( int i = 0; i < this.listeJoueurs.size(); i++ )
			if ( this.listeJoueurs.get(i).getNomPersonnage().equals( pNom )
				&& this.listeJoueurs.get(i).getPrenomPersonnage().equals( pPrenom ) )
				return this.listeJoueurs.get(i);

		return null;
	}

	/**
	 *  Recup une alerte avec son nom
	 * @param pNom
	 */
	public Alerte getAlerte(String pNom)
	{
		for ( int i = 0; i < this.listeAlertes.size(); i++ )
			if ( this.listeAlertes.get(i).getNomAlerte().equals( pNom ) )
				return this.listeAlertes.get(i);

		return null;
	}

	/**
	 * Récupération d'un indice à partir de son id
	 * @param pId L'id de l'indice
	 * @return L'indice s'il existe sinon null
	 */
	public Indice getIndice(int pId) {
		for ( int i = 0; i < this.listeIndices.size(); i++ )
		{
			if ( this.listeIndices.get(i).getId() == pId  )
			{
				return this.listeIndices.get(i);
			}
		}
		return null;
	}

	/**
	 * getHistorique
	 * @return Retourne la liste des notifications sous forme de liste de Strings
	 */
	public ArrayList<String> getHistorique()
	{
		ArrayList<String> notifs = new ArrayList<String>();
		for(Evenement evt : this.historique.getListeEvenements())
			notifs.add(evt.toString());
		return notifs;
	}

	public ArrayList<Evenement> getEvenements()
	{
		return this.historique.getListeEvenements();
	}
	/*
	public void setHistorique(Historique historique)
	{
		this.historique = historique;
	}
	*/
	public BaseDeDonnee getBdd()
	{
		return this.bdd;
	}

	/**
	 * @return the texte
	 */
	public String getTexte() {
		if(this.texte == null)
		{
			return "";
		}
		return this.texte;
	}

	public int getPrixIndice()
	{
		return this.prixIndice;
	}

	/**
	 * @param texte the texte to set
	 */
	public void setTexte(String texte) {
		this.texte = texte;
	}

	/**
	 * @param bdd the bdd to set
	 */
	public void setBdd(BaseDeDonnee bdd)
	{
		this.bdd = bdd;
	}

	/**
	 * @param chrono the chrono to set
	 */
	public void setChrono(ChronoGeneral chrono)
	{
		this.chrono = chrono;
	}


	public void setPrixIndice(int pPrix)
	{
		this.prixIndice = pPrix;
	}

	/**
	 * @return ArrayList<Alerte> - Liste des alertes
	 */
	public ArrayList<Alerte> getListeAlertes()
	{
		return this.listeAlertes;
	}
}
